#include <iostream>
#include <string>
#include <regex>

// 正则表达式(regular expression)描述了⼀种字符串匹配的模式（pattern），可以用来检查⼀个串是否含有某种⼦串、将匹配的⼦串替换或者从某个串中取出符合某个条件的⼦串等。
// 正则表达式的使⽤，可以使得HTTP请求的解析更加简单（工作变得的简单，这并不代表处理效率会变⾼，实际上效率上是低于直接的字符串处理的），使我们实现的HTTP组件库使⽤起来更加灵活。

int main()
{
    //HTTP请求格式 GET /baidu/login?user=dijia&password=aoteman HTTP/1.1\r\n
    std::string str = "GET /baidu/login?user=dijia&password=aoteman HTTP/1.1\r\n";
    std::smatch matches;
    std::regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\n|\r\n)?",std::regex::icase);//忽略大小写
    //(GET|HEAD|POST|PUT|DELETE)   表示匹配并提取其中任意一个字符串
    //[^?]*     [^?]匹配非问号字符， 后边的*表示0次或多次
    //\\?(.*)   \\?  表示原始的?字符 (.*)表示提取?之后的任意字符0次或多次，直到遇到空格
    //HTTP/1\\.[01]  表示匹配以HTTP/1.开始，后边有个0或1的字符串
    //(?:\n|\r\n)?   （?: ...） 表示匹配某个格式字符串，但是不提取， 最后的？表示的是匹配前边的表达式0次或1次
    bool ret = std::regex_match(str,matches,e);
    if(ret == false)
    {
        return -1;
    }
    
    // for(auto & e:matches)
    // {
    //     std::cout<<e<<std::endl;
    // }
    for(int i = 0;i<matches.size();i++)
    {
        std::cout<<i<<":"<<matches[i]<<std::endl;
    }

    return 0;
}